import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase Sierra representa la sierra que puede matar al mono.
 * 
 * @author (Programacion Orientada A Objetos - Gonzalez Donat - Neri Andriano) 
 * @version (15/05/12)
 */
public class Sierra extends Obstaculo
{
    private boolean sent;  //Sentido en el cual va girar
    private int dir;       //Direccion
    private boolean band;  //Bandera si toca piso
    
    /**
     * Constructor de la Clase Sierra
     * @param m Referencia al mono
     * @param s Sentido que tomara la Sierra
     * @param d Direccion que tomara la Sierra
     */
    public Sierra(Mono m,boolean s,int d)
    {
        super(m);
        sent = s;
        dir = d;
        band = true;
    }
    /**
     *Gira a la sierra y checa el piso donde esta
     */
    public void act() 
    {
        this.turn(37);
        this.checaPiso();
    } 
    
    /**
     * Checa el piso dependiendo el sentido al que se mueva la sierra.
     */
    public void checaPiso()
    {
        if(sent)
            mueveSentReloj();
        else
            mueveSentContReloj();
    }
    
    /**
     * Mueve la Sierra en sentido al reloj en el piso.
     */
    public void mueveSentReloj()
    {
        if(dir == 1)      
            this.evaluaYGira(0,10,this.getX()+3,this.getY(),2);
        if(dir == 2)
            this.evaluaYGira(-10,0,this.getX(),this.getY()+3,3);
        if(dir == 3)
            this.evaluaYGira(0,-10,this.getX()-3,this.getY(),4);
        if(dir == 4)
            this.evaluaYGira(10,0,this.getX(),this.getY()-3,1);
    }
    
    /**
     * Evalua si la Sierra esta sobre un piso y la bandera
     * @param x Posicion en x de la Sierra
     * @param y Posicion en y de la Sierra
     * @param nuevax Nueva posicion en x de la Sierra
     * @param nuevay Nueva posicion en y de la Sierra
     * @param nuevad Nueva direccion de la Sierra
     */
    public void evaluaYGira(int x, int y,int nuevax, int nuevay, int nuevad)
    {
        if((Piso)this.getOneObjectAtOffset(x,y,Piso.class) != null || band)
            this.setLocation(nuevax,nuevay);
        if((Piso)this.getOneObjectAtOffset(x,y,Piso.class) != null && band)
            band = false;
        if((Piso)this.getOneObjectAtOffset(x,y,Piso.class) == null && !band){
            dir = nuevad;
            band = true;
        }
    }
    
    /**
     * Mueve la Sierra en sentido en contra reloj en el piso.
     */
    public void mueveSentContReloj()
    {
        if(dir == 1)      
            this.evaluaYGira(0,10,this.getX()-3,this.getY(),2);
        if(dir == 2)
            this.evaluaYGira(10,0,this.getX(),this.getY()+3,3);
        if(dir == 3)
            this.evaluaYGira(0,-10,this.getX()+3,this.getY(),4);
        if(dir == 4)
            this.evaluaYGira(-10,0,this.getX(),this.getY()-3,1);
    }
    
    /**
     * Ejecuta la accion para disminuir la vida del mono.
     */
    public void accion()
    {
        ((Escenario)this.getWorld()).disminuyeVidas();
    }
}
